package br.com.bacabeleireiros.sysbeleza.entity;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.ForeignKey;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "produto")
public class Produto implements Serializable {

	private static final long serialVersionUID = 1L;
	private Long idProduto;
	private String descProduto;
	private double valorCusto;
	private double valorVenda;
	private double saldoEstoque;
	private Fornecedor fornecedor;
	private Origem origem;
	private TipoProduto tipoProduto;
	private Marca marca;
	private Date dataCadastro;

	public Produto() {
		tipoProduto = new TipoProduto();
		origem = new Origem();
		fornecedor = new Fornecedor();
		marca = new Marca();
	}

	@Id
	@SequenceGenerator(name = "seqProduto", sequenceName = "seq_produto", allocationSize = 1)
	@GeneratedValue(generator = "seqProduto", strategy = GenerationType.SEQUENCE)
	@Column(name = "id_produto")
	public Long getIdProduto() {
		return idProduto;
	}

	public void setIdProduto(Long idProduto) {
		this.idProduto = idProduto;
	}

	@Column(name = "desc_produto", length = 40, nullable = false)
	public String getDescProduto() {
		return descProduto;
	}

	public void setDescProduto(String descProduto) {
		this.descProduto = descProduto;
	}

	@ManyToOne
	@JoinColumn(name = "id_marca", foreignKey = @ForeignKey(name = "fk_produto_marca"))	
	public Marca getMarca() {
		return marca;
	}

	public void setMarca(Marca marca) {
		this.marca = marca;
	}

	@ManyToOne
	@JoinColumn(name = "id_forncedor", foreignKey = @ForeignKey(name = "fk_produto_fornecedor"))
	public Fornecedor getFornecedor() {
		return fornecedor;
	}

	public void setFornecedor(Fornecedor fornecedor) {
		this.fornecedor = fornecedor;
	}

	@Column(name = "valor_custo", precision = 2, nullable = false)
	public double getValorCusto() {
		return valorCusto;
	}

	public void setValorCusto(double valorCusto) {
		this.valorCusto = valorCusto;
	}

	@Column(name = "valor_venda", precision = 2, nullable = false)
	public double getValorVenda() {
		return valorVenda;
	}

	public void setValorVenda(double valorVenda) {
		this.valorVenda = valorVenda;
	}

	@ManyToOne
	@JoinColumn(name = "id_origem", foreignKey = @ForeignKey(name = "fk_produto_origem"), nullable = false)
	public Origem getOrigem() {
		return origem;
	}

	public void setOrigem(Origem origem) {
		this.origem = origem;
	}

	@ManyToOne
	@JoinColumn(name = "id_tipo_produto", foreignKey = @ForeignKey(name = "fk_produto_tipo_produto"), nullable = false)
	public TipoProduto getTipoProduto() {
		return tipoProduto;
	}

	public void setTipoProduto(TipoProduto tipoProduto) {
		this.tipoProduto = tipoProduto;
	}

	@Column(name = "saldo_estoque", nullable = false)
	public double getSaldoEstoque() {
		return saldoEstoque;
	}

	public void setSaldoEstoque(double saldoEstoque) {
		this.saldoEstoque = saldoEstoque;
	}
	
	
	@Column(name = "data_cadastro", nullable = false)
	@Temporal(TemporalType.DATE)
	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((idProduto == null) ? 0 : idProduto.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Produto other = (Produto) obj;
		if (idProduto == null) {
			if (other.idProduto != null)
				return false;
		} else if (!idProduto.equals(other.idProduto))
			return false;
		return true;
	}

}
